package com.SparkCore.ACC

import org.apache.spark.{SparkConf, SparkContext}


/**
 * 累加器 核心编程
 * 多加少加的区别
 * 结论：一般情况下累加器放在行动算子下面执行操作
 */
object Spark03_ACC {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local").setAppName("wordcount")
    val sc = new SparkContext(sparkConf)

    val rdd = sc.makeRDD(List(1, 2, 3, 4, 5, 6))

   //创建系统的累加器
    //Spark默认就提供了简单数据聚合的累加器
    val sumACC = sc.longAccumulator("sum")

    //浮点型累加器
    //val sumAccumulator = sc.doubleAccumulator("sum")
    //集合类型累加器
    //sc.collectionAccumulator()
    //使用累加器
    val mapRDD = rdd.map(
      num => {
        sumACC.add(num)
        num
      }
    )


    //获取累加器的值
    //少加：转换算子中调用累加器，如果没有行动算子的话，那么就不执行

    //多加：转换算子中调用累加器，如果没有行动算子的话，那么就不执行
    mapRDD.collect()
    mapRDD.collect() //调用一走一遍 所以加两次
    //一般情况下累加器放在行动算子下面执行操作
    println(sumACC.value)
    sc.stop()
  }
}
